package com.macro.mall.mapper;

import com.macro.mall.model.XhsOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Update;

import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Mapper
public interface XhsOrderMapper {
    // 插入订单
    int insert(XhsOrder order);


    /**
     * 根据ID更新订单信息
     * @param order 订单对象
     * @return 影响的行数
     */
    int updateOrder(XhsOrder order);

    // 根据ID查询订单
    XhsOrder selectById(Long id);

    // 根据外部订单ID查询订单
    XhsOrder selectByOutOrderId(String outOrderId);

    // 根据小红书订单ID查询订单
    XhsOrder selectByXhsOrderId(String xhsOrderId);

    // 根据用户openId查询订单列表
    List<XhsOrder> selectByOpenId(String openId);

    // 根据订单状态查询订单列表
    List<XhsOrder> selectByStatus(@Param("orderStatus")Integer orderStatus, @Param("openId")String openId,@Param("voucherCode")String voucherCode,@Param("storeId")String storeId);

    /**
     * 根据订单状态列表查询订单
     * @param orderStatus 订单状态列表 (e.g. [0,1,2])
     * @return 符合条件的订单列表
     */
    List<XhsOrder> selectByStatuList(@Param("orderStatus") List<Integer> orderStatus,@Param("openId")String openId);

    // 更新订单状态
    int updateStatus(@Param("id") Long id, @Param("orderStatus") Integer orderStatus);

    // 更新支付信息
    int updatePayInfo(@Param("id") Long id,
                     @Param("xhsOrderId") String xhsOrderId,
                     @Param("payChannel") Integer payChannel,
                     @Param("payToken") String payToken,
                     @Param("payTime") Date payTime,
                     @Param("payExpiredTime") Date payExpiredTime);

    // 更新回调状态
    int updateCallbackStatus(@Param("id") Long id, @Param("callbackStatus") Integer callbackStatus);

    // 分页查询订单
    List<XhsOrder> selectPage(@Param("startTime") Date startTime,
                             @Param("endTime") Date endTime,
                             @Param("orderStatus") Integer orderStatus,
                             @Param("offset") Integer offset,
                             @Param("limit") Integer limit);

    // 统计订单数量
    int count(@Param("startTime") Date startTime,
              @Param("endTime") Date endTime,
              @Param("orderStatus") Integer orderStatus);


    /**
     * 定时任务取消订单
     * @return
     */
    @Update("UPDATE xhs_order " +
            "SET order_status = 3, biz_update_time = NOW() " +
            "WHERE order_status = 0 AND order_expired_time < NOW()")
    int updateTimeoutOrders();



    /**
     * 更新劵码信息
     * @param id 订单ID
     * @param voucherCode 劵码
     * @return 影响行数
     */
    int updateVoucherCode(@Param("id") String id, @Param("voucherCode") String voucherCode,@Param("url") String url);


    /**
     * 根据劵码查询订单
     * @param voucherCode
     * @return
     */
    XhsOrder selectByVoucherCode(String voucherCode);




    // 根据小红书回调修改订单状态为已使用
    int updateStatusByXHSCallBac(@Param("xhsOrderId") String id, @Param("orderStatus") Integer orderStatus);

    /**
     * 核销订单后修改订单核销门店以及状态
     * @param outOrderId
     * @param poiId
     */
    void updateOrderDetail(@Param("outOrderId")String outOrderId, @Param("poiId")String poiId);

    String getOutOrderByVoucherCode(@Param("voucherCode")String voucherCode);

    List<XhsOrder> selbystroreId(@Param("poiId")String poiId);

    // ========== 新增方法：订单列表管理 ==========
    
    /**
     * 分页查询订单列表（关联商品表）
     * @param keyword 搜索关键词
     * @param statusList 订单状态列表
     * @param orderStatus 单个订单状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 订单列表（包含商品信息）
     */
    List<Map<String, Object>> selectOrderListWithProduct(
        @Param("keyword") String keyword,
        @Param("statusList") List<Integer> statusList,
        @Param("orderStatus") Integer orderStatus,
        @Param("startTime") String startTime,
        @Param("endTime") String endTime
    );
    
    /**
     * 统计订单总数
     * @param keyword 搜索关键词
     * @param statusList 订单状态列表
     * @param orderStatus 单个订单状态
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 总数
     */
    long countOrderList(
        @Param("keyword") String keyword,
        @Param("statusList") List<Integer> statusList,
        @Param("orderStatus") Integer orderStatus,
        @Param("startTime") String startTime,
        @Param("endTime") String endTime
    );
    
    /**
     * 根据ID查询订单详情（关联商品表）
     * @param id 订单ID
     * @return 订单详情（包含商品信息）
     */
    Map<String, Object> selectOrderDetailWithProduct(@Param("id") Long id);
    
    /**
     * 批量更新订单状态为删除
     * @param ids 订单ID列表
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int batchUpdateDeleteStatus(@Param("ids") List<Long> ids, @Param("updateTime") Date updateTime);
    
    /**
     * 批量关闭订单
     * @param ids 订单ID列表
     * @param reason 关闭原因
     * @param updateTime 更新时间
     * @return 影响行数
     */
    int batchCloseOrders(@Param("ids") List<Long> ids, @Param("reason") String reason, @Param("updateTime") Date updateTime);
    
    /**
     * 根据ID列表查询订单（用于批量操作前的状态检查）
     * @param ids 订单ID列表
     * @return 订单列表
     */
    List<XhsOrder> selectByIdList(@Param("ids") List<Long> ids);
    
    // ========== 数据看板统计方法 ==========
    
    /**
     * 获取数据看板统计数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计数据
     */
    Map<String, Object> getDashboardStats(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取按小时聚合的趋势数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    List<Map<String, Object>> getDashboardTrendByHour(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取按天聚合的趋势数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    List<Map<String, Object>> getDashboardTrendByDay(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
    
    /**
     * 获取按周聚合的趋势数据
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 趋势数据
     */
    List<Map<String, Object>> getDashboardTrendByWeek(@Param("startDate") LocalDate startDate, @Param("endDate") LocalDate endDate);
}
